package com.tedu.api.socket;


import java.io.*;
import java.net.Socket;
import java.util.Scanner;

/**
 * 聊天室----功能：客户端链接服务器--写出文本  Version 1
 *
 * 聊天室----功能：客户端链接服务器--并且发送文本  Version 1
 *
 *                 IO流操作---客户端，服务器端【存在Socket类】
 * 调用Socket中：获取输入流，输出流
 *                  getInputStream()  获取由套接字传入输入流【低级流】
 *                  getOutputStream() 获取由套接字传入输出流【低级流】
 *
 * 网络通讯  +  IO流
 * Socket套接字  +文本传输
 *
 * 网络通讯遵循两种原则：
 *                    C/S架构：Client/Server   客户端/服务器  早期软件应用【手机：应用商店下载操作】
 * JavaSE  桌面型软件【并不擅长】
 *
 * B/S架构：
 *                  Browser/Server  浏览器端/服务器  中期软件应用【HTTP协议：后台逻辑网站】
 * JavaEE 浏览器打开网址【软件---擅长】
 * JavaSE 逻辑  + WEB 前台 + Mysql 数据库
 *
 * C/S架构实现聊天室软件
 * Client   客户端 对象    Socket对象【具备网络通讯所有规则】TCP协议
 * 【套接字：网络通讯类】
 * 包位置：java.net
 * Socket对象
 * 客户端开发步骤：
 * 1.      定义私有属性：Socket【全局属性：网络通讯类所有方法以及属性，本类使用】
 *2.    创建构造器：实例化Socket对象【传入参数：IP，端口】
 * 3.      创建方法：start():IO流
 * 4.           构建主方法：创建Client对象，并且启动start方法
 * ----------------------------------------------
 * Server   服务器 对象    ServerSocket对象【网络通讯所有规则】TCP协议
 *
 * 以上两个对象底层传输协议：TCP协议--发送数据【商务：电商，后台..】
 *                       可靠性比较好协议：传输数据效率低，基于字节流
 *                       UDP协议--发送数据【游戏】
 *                       不可靠的协议，传输数据效率高，基于数据报
 */
public class Client {
    //1.定义私有属性：Socket网络通讯类

    private Socket socket;
    //2.创建构造器：创建Socket对象：传入：IP+端口

    /**
     * 客户端Socket对象
     * 构造器new Socket("传入IP",端口：数值)
     *
     * 第一个参数：通过 window+r  cmd  ipconfig  --IVP 4  IP号
     * 使用本地IP地址：localhost   |  127.0.0.1
     * 端口：用来表示计算机上软件大门，每个软件端口号
     *      端口号表示形式：4位以内数值
     *      端口号：6666
     */
    public Client() {
        try {
            socket=new Socket("",6666);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    //3.创建start方法:逻辑-IO流
    public void start() {
        //5.从套接字【网络编程类：手机】

        OutputStream os=null;
        //套高级流--传输字符串--①转换流，目的：指定字符集

        OutputStreamWriter osw=null;
        //套高级流--缓冲流字符流，目的：加速文字传输  【坑】

        BufferedWriter bw=null;
        //套高级流---字符输出流,目的：输出一行一行文本

        PrintWriter pw= null;
        try {
            os=socket.getOutputStream();//低级流 负责写出
            osw=new OutputStreamWriter(os,"UTF8");
            bw=new BufferedWriter(osw);
            pw=new PrintWriter(bw,true);
        }catch(UnsupportedEncodingException e){
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        } finally {

        }
        //6.从控制台一直说话
        System.out.println("对服务器端说话：");
        Scanner input=new Scanner(System.in);
        //卡住，等待用户输入
        String line=null;
        //6.1变量目的：保存客户端每次说话
        while(true){  //一直
            //说的每句话--保存line--通过六i  一行行写出
            line=input.nextLine();
            //从客户端控制台输入文本
            pw.println(line);
            System.out.println("写出成功~~");
        }
    }



    //4.创建主方法
    public static void main(String[] args)  {
        //客户端对象创建
        Client c=new Client();
        c.start();
    }
}
































